home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 248_01 / cdict.c < prev    next >
Text File  |  1989-08-16  |  4KB  |  184 lines

  1. /*    CDICT:    Compress Dictionary utility program for
  2.         MicroSPELL 1.01
  3.  
  4.         (C)opyright May 1987 by Daniel Lawrence
  5.         All Rights Reserved
  6. */
  7.  
  8. #include    <stdio.h>
  9. #include    "dopt.h"
  10. #include    "dsfx.h"
  11.  
  12. /* globals */
  13.  
  14. char mdfile[NSTRING];        /* main dictionary text file name */
  15. char mcfile[NSTRING];        /* compressed dictionary file name */
  16. FILE *mdptr = NULL;        /* main dictionary file pointer */
  17. FILE *mcptr = NULL;        /* compressed dictionary file pointer */
  18. int sflen[NSUFFIX];        /* length of suffixes */
  19.  
  20. main(argc, argv)
  21.  
  22. int argc;    /* # of command line arguments */
  23. char **argv;    /* text of command line arguments */
  24.  
  25. {
  26.     register char *word;        /* current word */
  27.     register int suffix;        /* suffix index */
  28.     char lastword[NSTRING];        /* previous word in dictionary */
  29.     char tempword[NSTRING];        /* temporary word in dictionary */
  30.     char *nxtmword();
  31.  
  32.     printf("CDICT Dictionary Compression Utility for MicroSPELL v1.00\n");
  33.  
  34.     if (argc != 3) {
  35.         help();
  36.         exit(EXBADOPT);
  37.     }
  38.  
  39.     strcpy(mdfile, argv[1]);
  40.     strcpy(mcfile, argv[2]);
  41.  
  42.     if (mopen() != TRUE) {
  43.         printf("%%Can not open text dictionary file\n");
  44.         exit(EXMDICT);
  45.     }
  46.  
  47.     /* open the output compressed dictionary file */
  48.     mcptr = fopen(mcfile, "w");
  49.     if (mcptr == NULL) {
  50.         printf("%%Can not open compressed dictionary output file\n");
  51.         exit(EXMDICT);
  52.     }
  53.  
  54.     /* prepare the suffix length table */
  55.     for (suffix = 0; suffix < NSUFFIX; suffix++)
  56.         sflen[suffix] = strlen(sfx[suffix]);
  57.  
  58.     printf("[Compressing %s => %s]\n", mdfile, mcfile);
  59.     lastword[0] = 0;    /* null last word */
  60.  
  61.     /* scan the dictionary, compressing */
  62.     word = nxtmword();
  63.     while (word) {
  64.         strcpy(tempword, word);
  65.         cmpsword(lastword, word);
  66.         strcpy(lastword, tempword);
  67.         word = nxtmword();
  68.     }
  69.  
  70.     /* close things up */
  71.     mclose();
  72.     fclose(mcptr);
  73.     printf("[Dictionary Compressed]\n");
  74. }
  75.  
  76. help()        /* tell us about cdict... */
  77.  
  78. {
  79.     printf("\nUsage:\n\n");
  80.     printf("    CDICT <text dictionary> <compressed dictionary>\n");
  81. }
  82.  
  83. mopen()        /* open the main dicionary */
  84.  
  85. {
  86.     /* if it is already open, close it down */
  87.     if (mdptr != NULL)
  88.         fclose(mdptr);
  89.  
  90.     /* open up the text dictionary... */
  91.     if ((mdptr = fopen(mdfile, "r")) == NULL)
  92.         return(FALSE);
  93.  
  94.     return(TRUE);
  95. }
  96.  
  97. mclose()    /* close the dictionary down */
  98.  
  99. {
  100.     /* if it is already open, close it down */
  101.     if (mdptr != NULL)
  102.         fclose(mdptr);
  103.     mdptr = NULL;
  104. }
  105.  
  106. char *nxtmword()    /* get the next word from the main dictionary */
  107.  
  108. {
  109.     static char word[NSTRING];    /* word to return */
  110.  
  111.     /* is it already closed? */
  112.     if (mdptr == NULL)
  113.         return(NULL);
  114.  
  115.     /* get the next word */
  116.     if (fgets(word, NSTRING - 1, mdptr) == NULL) {
  117.         /* no more left!!!! close out */
  118.         fclose(mdptr);
  119.         mdptr = NULL;
  120.         return(NULL);
  121.     }
  122.  
  123.     /* all's well, dump the return, any trailing spaces and
  124.        return the word */
  125.     do
  126.         word[strlen(word) - 1] = 0;
  127.     while (word[strlen(word) - 1] == ' ');
  128.     return(word);
  129. }
  130.  
  131. cmpsword(lastword, word)    /* compress the given word */
  132.  
  133. char *lastword;        /* previous dictionary word */
  134. char *word;        /* current dictionary word */
  135.  
  136. {
  137.     register int index;    /* index into current word */
  138.     register int same;    /* # of same characters */
  139.     register int suffix;    /* suffix code */
  140.     register int wlen;    /* length of current word */
  141.  
  142.     /* scan for common suffixes */
  143.     wlen = strlen(word);
  144.     for (suffix = 0; suffix < NSUFFIX; suffix++) {
  145.         if (wlen < sflen[suffix])
  146.             continue;
  147.         if (strcmp(&word[wlen - sflen[suffix]], sfx[suffix]) == 0) {
  148.             word[wlen - sflen[suffix]] = 0;    /* trunc it */
  149.             break;
  150.         }
  151.     }
  152.  
  153.     /* If there is no suffix...suffix ends up as NSUFFIX */
  154.  
  155.     /* scan for like beginning characters */
  156.     index = 0;
  157.     while (lastword[index] && lastword[index] == word[index])
  158.         index++;
  159.  
  160.     same = index;
  161. #if    ASCII
  162.     suffix |= 128;
  163. #endif
  164. /*printf("[%s/%s] %u (%u:%s)\n",lastword, word, same, suffix&127, sfx[suffix&127]);*/
  165.     fprintf(mcptr, "%c%s%c", 'A'+same, &word[index], suffix);
  166. }
  167.  
  168. #if    CMS
  169. #undef    fopen
  170. /*    The IBM 30xx likes to tell us when file opens
  171.     fail...it's too chatty....I like to handle these myself    */
  172.  
  173. FILE *cmsopen(file, mode)
  174.  
  175. char *file;    /* name of file to open */
  176. char *mode;    /* mode to open it in */
  177.  
  178. {
  179.     quiet(1);
  180.     return(fopen(file,mode));
  181. }
  182. #endif
  183.  
  184.